#include <iostream>

// 懒汉模式:懒创建->等到要用了再创建。
class Singleton
{
private:
    // 使用static静态参数，只会被初始化创建一次。
    // 无须担心编译问题。
    static Singleton _self;
private:
    int _count;
    Singleton()
        :_count(99)
    {
        std::cout << "单例模式" << std::endl;
    }
public:
    static Singleton GetInstance()
    {
        // 仅仅C++11才对static静态参数做了线程安全的补充。
        static Singleton _self;
        return _self;
    }
    int GetData()
    {
        return _count;
    }
};

int main()
{
    std::cout << Singleton::GetInstance().GetData() << std::endl;

    return 0;
}

// #include <iostream>

// // 饿汉模式:饥不择食，直接就初始化出来。
// class Singleton
// {
// private:
//     // 使用static静态参数，只会被初始化创建一次。
//     // 无须担心编译问题。
//     // 而且无需担心线程问题，因为再怎么样都只有一个类对象。
//     static Singleton _self;
// private:
//     int _count;
//     Singleton()
//         :_count(99)
//     {
//         std::cout << "单例模式" << std::endl;
//     }
// public:
//     static Singleton GetInstance()
//     {
//         return _self;
//     }
//     int GetData()
//     {
//         return _count;
//     }
// };
// 初始化类域中的一个变量。
// Singleton Singleton:: _self;

// int main()
// {
//     std::cout << Singleton::GetInstance().GetData() << std::endl;

//     return 0;
// }